/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.edu.senaclem.persistencia;

import co.edu.senaclem.modelo.Aprendiz;
import co.edu.senaclem.modelo.Coordinador;
import co.edu.senaclem.modelo.Instructor;
import co.edu.senaclem.modelo.Permiso;
import static co.edu.senaclem.persistencia.Persistencia.areadb;
import static co.edu.senaclem.persistencia.Persistencia.con;
import static co.edu.senaclem.persistencia.Persistencia.conectar;
import static co.edu.senaclem.persistencia.Persistencia.desconectar;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;

/**
 *
 * @author DILOVE
 */
@Stateless
public class PermisoDAO implements IPermisoDAO {

    ICoordinadorDAO coordinadorDAO = new CoordinadorDAO();
    IAprendizDAO aprendizDAO = new AprendizDAO();
    IInstructorDAO instructorDAO = new InstructorDAO();
    public static ResultSet resSet = null;

    @Override
    public void registrar(Permiso permiso) throws Exception {
        //System.out.println("Permiso en en DAO "+permiso.toString());
        try {
            String ins;
            String coor;
            if (conectar()) {
                if (permiso.getDocumentoInstructor() == null) {
                    ins = "null";
                } else {
                    ins = permiso.getDocumentoInstructor().getDocumento().toString();
                }
                if (permiso.getDocumentoCoordinador() == null) {
                    coor = "null";
                } else {
                    coor = permiso.getDocumentoCoordinador().getDocumento().toString();
                }
                String consulta = "insert into permiso values(null,'" + permiso.getFecha() + "','" + permiso.getHoraDesde() + "','" + permiso.getHoraHasta() + "','" + permiso.getMotivo() + "','" + permiso.getEstado() + "'," + coor + "," + ins + "," + permiso.getDocumentoAprendiz().getDocumento().getDocumento() + ")";
                // System.out.println("El insert del permiso "+consulta);
                areadb = con.createStatement();
                areadb.execute(consulta);
                desconectar();
            }
        } catch (RuntimeException e) {
            throw e;
        }
    }

    @Override
    public void modificar(Permiso permiso) throws Exception {
        try {
            if (conectar()) {
                String consulta = "update permiso set fechapermiso='" + permiso.getFecha() + "', horadesdepermiso='" + permiso.getHoraDesde() + "', horahastapermiso='" + permiso.getHoraHasta() + "', motivopermiso='" + permiso.getMotivo() + "', estadopermiso='" + permiso.getEstado() + "', documentocoordinador=" + permiso.getDocumentoCoordinador().getDocumento() + ", documentoinstructor=" + permiso.getDocumentoInstructor().getDocumento() + ", documentoaprendiz=" + permiso.getDocumentoAprendiz().getDocumento() + " where codigopermiso=" + permiso.getCodigo() + "";
                areadb = con.createStatement();
                areadb.execute(consulta);

                desconectar();
            }
        } catch (RuntimeException e) {
            throw e;
        }
    }

    @Override
    public void eliminar(Permiso permiso) throws Exception {
        try {
            if (conectar()) {
                String consulta = "delete from permiso where codigopermiso=" + permiso.getCodigo() + "";
                areadb = con.createStatement();
                areadb.execute(consulta);

                desconectar();
            }
        } catch (RuntimeException e) {
            throw e;
        }
    }

    @Override
    public Permiso consultarPorId(Integer codigopermiso) throws Exception {

        try {
            Permiso miPermiso = null;
            if (conectar()) {
                String consulta = "Select * From permiso where codigopermiso=" + codigopermiso + "";
                areadb = con.createStatement();
                resSet = areadb.executeQuery(consulta);

                if (resSet.next()) {
                    miPermiso = new Permiso();
                    miPermiso.setCodigo(resSet.getInt("codigopermiso"));
                    miPermiso.setFecha(resSet.getString("fechapermiso"));
                    miPermiso.setHoraDesde(resSet.getString("horadesdepermiso"));
                    miPermiso.setHoraHasta(resSet.getString("horahastapermiso"));
                    miPermiso.setMotivo(resSet.getString("motivopermiso"));
                    miPermiso.setEstado(resSet.getString("estadopermiso"));
                    long documentoC = resSet.getLong("documentocoordinador");
                    Coordinador coordinador = coordinadorDAO.consultarPorId(documentoC);
                    miPermiso.setDocumentoCoordinador(coordinador);
                    long documentoA = resSet.getLong("documentoaprendiz");
                    Aprendiz aprendiz = aprendizDAO.consultarPorId(documentoA);
                    miPermiso.setDocumentoAprendiz(aprendiz);
                    long documentoI = resSet.getLong("documentoinstructor");
                    Instructor instructor = instructorDAO.consultarPorId(documentoI);
                    miPermiso.setDocumentoInstructor(instructor);
                }
                resSet.close();
                desconectar();
            }

            return miPermiso;
        } catch (RuntimeException e) {
            throw e;
        }
    }

    @Override
    public List<Permiso> consultar() throws Exception {
        try {
            List<Permiso> permisos = new ArrayList<Permiso>();
            if (conectar()) {
                String consulta = "Select * From permiso";
                areadb = con.createStatement();
                resSet = areadb.executeQuery(consulta);
                while (resSet.next()) {
                    Permiso miPermiso = new Permiso();
                    miPermiso.setCodigo(resSet.getInt("codigopermiso"));
                    miPermiso.setFecha(resSet.getString("fechapermiso"));
                    miPermiso.setHoraDesde(resSet.getString("horadesdepermiso"));
                    miPermiso.setHoraHasta(resSet.getString("horahastapermiso"));
                    miPermiso.setMotivo(resSet.getString("motivopermiso"));
                    miPermiso.setEstado(resSet.getString("estadopermiso"));
                    if (resSet.getObject("documentocoordinador") == null) {
                        miPermiso.setDocumentoCoordinador(null);
                    } else {
                        long documentoC = resSet.getLong("documentocoordinador");
                        Coordinador coordinador = coordinadorDAO.consultarPorId(documentoC);
                        miPermiso.setDocumentoCoordinador(coordinador);
                    }
                    long documentoA = resSet.getLong("documentoaprendiz");
                    //System.out.println("El aprendiz del permiso es "+documentoA);
                    Aprendiz aprendiz = aprendizDAO.consultarPorId(documentoA);
                    miPermiso.setDocumentoAprendiz(aprendiz);
                    if (resSet.getObject("documentoinstructor") == null) {
                        miPermiso.setDocumentoInstructor(null);
                    } else {
                        long documentoI = resSet.getLong("documentoinstructor");
                        Instructor instructor = instructorDAO.consultarPorId(documentoI);
                        miPermiso.setDocumentoInstructor(instructor);
                    }
                    permisos.add(miPermiso);
                }

                resSet.close();
                desconectar();
            }

            return permisos;
        } catch (RuntimeException e) {
            throw e;
        }
    }

    @Override
    public List<Permiso> consultarPermisosDiarios(String fecha) throws Exception {
        try {
            List<Permiso> permisos = new ArrayList<Permiso>();
            if (conectar()) {
                String consulta = "select * from permiso where permiso.fechapermiso = '" + fecha + "';";
                areadb = con.createStatement();
                resSet = areadb.executeQuery(consulta);
                while (resSet.next()) {
                    Permiso miPermiso = new Permiso();
                    miPermiso.setCodigo(resSet.getInt("codigopermiso"));
                    miPermiso.setFecha(resSet.getString("fechapermiso"));
                    miPermiso.setHoraDesde(resSet.getString("horadesdepermiso"));
                    miPermiso.setHoraHasta(resSet.getString("horahastapermiso"));
                    miPermiso.setMotivo(resSet.getString("motivopermiso"));
                    miPermiso.setEstado(resSet.getString("estadopermiso"));
                    long documentoC = resSet.getLong("documentocoordinador");
                    Coordinador coordinador = coordinadorDAO.consultarPorId(documentoC);
                    miPermiso.setDocumentoCoordinador(coordinador);
                    long documentoA = resSet.getLong("documentoaprendiz");
                    Aprendiz aprendiz = aprendizDAO.consultarPorId(documentoA);
                    miPermiso.setDocumentoAprendiz(aprendiz);
                    long documentoI = resSet.getLong("documentoinstructor");
                    Instructor instructor = instructorDAO.consultarPorId(documentoI);
                    miPermiso.setDocumentoInstructor(instructor);

                    permisos.add(miPermiso);
                }

                resSet.close();
                desconectar();
            }

            return permisos;
        } catch (RuntimeException e) {
            throw e;
        }
    }

    @Override
    public String generarCodigoPermiso() throws Exception {
        int max = 0;
        try {
            if (conectar()) {
                String consulta = "select max(codigopermiso) as maxcp from permiso;";
                areadb = con.createStatement();
                resSet = areadb.executeQuery(consulta);
                if (resSet.next()) {
                    max = resSet.getInt("maxcp");
                    max = max + 1;
                }

                resSet.close();
                desconectar();
            }

            return max + "";
        } catch (RuntimeException e) {
            throw e;
        }
    }

    @Override
    public List<Permiso> consultarPermisosDiariosIns(String fechaSistema, Instructor ins) throws Exception {
        try {
            List<Permiso> permisos = new ArrayList<Permiso>();
            if (conectar()) {
                String consulta = "select permiso.* from permiso, aprendiz, fichatitulacion where permiso.fechapermiso='" + fechaSistema + "' and permiso.documentoaprendiz=aprendiz.documentoaprendiz and aprendiz.fichatitulacion=fichatitulacion.fichatitulacion and fichatitulacion.fichatitulacion IN (select fichatitulacion.fichatitulacion from fichatitulacion, instructor, asignafichas where instructor.documentoinstructor=" + ins.getDocumento().getDocumento() + " and asignafichas.documentoinstructor=instructor.documentoinstructor and asignafichas.fichatitulacion=fichatitulacion.fichatitulacion)";
                //System.out.println("Consulta de Permisos Instructor "+consulta);
                areadb = con.createStatement();
                resSet = areadb.executeQuery(consulta);
                while (resSet.next()) {
                    Permiso miPermiso = new Permiso();
                    miPermiso.setCodigo(resSet.getInt("codigopermiso"));
                    miPermiso.setFecha(resSet.getString("fechapermiso"));
                    miPermiso.setHoraDesde(resSet.getString("horadesdepermiso"));
                    miPermiso.setHoraHasta(resSet.getString("horahastapermiso"));
                    miPermiso.setMotivo(resSet.getString("motivopermiso"));
                    miPermiso.setEstado(resSet.getString("estadopermiso"));
                    long documentoC = resSet.getLong("documentocoordinador");
                    Coordinador coordinador = coordinadorDAO.consultarPorId(documentoC);
                    miPermiso.setDocumentoCoordinador(coordinador);
                    long documentoA = resSet.getLong("documentoaprendiz");
                    Aprendiz aprendiz = aprendizDAO.consultarPorId(documentoA);
                    miPermiso.setDocumentoAprendiz(aprendiz);
                    long documentoI = resSet.getLong("documentoinstructor");
                    Instructor instructor = instructorDAO.consultarPorId(documentoI);
                    miPermiso.setDocumentoInstructor(instructor);

                    permisos.add(miPermiso);
                }

                resSet.close();
                desconectar();
            }

            return permisos;
        } catch (RuntimeException e) {
            throw e;
        }
    }

    @Override
    public List<Permiso> consultarPermisosAprendiz(Long documentoAprendiz) throws Exception {
        try {
            List<Permiso> permisos = new ArrayList<Permiso>();
            if (conectar()) {
                String consulta = "Select * From permiso where documentoaprendiz=" + documentoAprendiz + ";";
                areadb = con.createStatement();
                resSet = areadb.executeQuery(consulta);
                while (resSet.next()) {
                    Permiso miPermiso = new Permiso();
                    miPermiso.setCodigo(resSet.getInt("codigopermiso"));
                    miPermiso.setFecha(resSet.getString("fechapermiso"));
                    miPermiso.setHoraDesde(resSet.getString("horadesdepermiso"));
                    miPermiso.setHoraHasta(resSet.getString("horahastapermiso"));
                    miPermiso.setMotivo(resSet.getString("motivopermiso"));
                    miPermiso.setEstado(resSet.getString("estadopermiso"));
                    if (resSet.getObject("documentocoordinador") == null) {
                        miPermiso.setDocumentoCoordinador(null);
                    } else {
                        long documentoC = resSet.getLong("documentocoordinador");
                        Coordinador coordinador = coordinadorDAO.consultarPorId(documentoC);
                        miPermiso.setDocumentoCoordinador(coordinador);
                    }
                    long documentoA = resSet.getLong("documentoaprendiz");
                    //System.out.println("El aprendiz del permiso es "+documentoA);
                    Aprendiz aprendiz = aprendizDAO.consultarPorId(documentoA);
                    miPermiso.setDocumentoAprendiz(aprendiz);
                    if (resSet.getObject("documentoinstructor") == null) {
                        miPermiso.setDocumentoInstructor(null);
                    } else {
                        long documentoI = resSet.getLong("documentoinstructor");
                        Instructor instructor = instructorDAO.consultarPorId(documentoI);
                        miPermiso.setDocumentoInstructor(instructor);
                    }
                    permisos.add(miPermiso);
                }

                resSet.close();
                desconectar();
            }

            return permisos;
        } catch (RuntimeException e) {
            throw e;
        }
    }

    @Override
    public void aprobarPermiso(Permiso permiso) throws Exception {
        try {
            if (conectar()) {
                String consulta = "update permiso set estadopermiso='" + permiso.getEstado() + "', documentoinstructor=" + permiso.getDocumentoInstructor().getDocumento().getDocumento() + " where codigopermiso=" + permiso.getCodigo() + "";
                areadb = con.createStatement();
                areadb.execute(consulta);

                desconectar();
            }
        } catch (RuntimeException e) {
            throw e;
        }
    }

    @Override
    public void aprobarPermisoC(Permiso permiso) throws Exception {
        try {
            if (conectar()) {
                String consulta = "update permiso set estadopermiso='" + permiso.getEstado() + "', documentocoordinador=" + permiso.getDocumentoCoordinador().getDocumento().getDocumento() + " where codigopermiso=" + permiso.getCodigo() + "";
                //System.out.println("COnsulta de aprueba coordinador "+consulta);
                areadb = con.createStatement();
                areadb.execute(consulta);

                desconectar();
            }
        } catch (RuntimeException e) {
            throw e;
        }
    }

}
